package com.itheima.d3_exception;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 异常的体系：
 * Error：
 * 代表的系统级别错误(属于严重问题)，也就是说系统一旦出现问题，sun公司会把这些问题封装成Error对象给出来，
 * 说白了，Error是给sun公司自己用的，不是给我们程序员用的，因此我们开发人员不用管它。
 *
 * Exception：
 * 叫异常，它代表的才是我们程序可能出现的问题，所以，我们程序员通常会用Exception以及它的孩子来封装程序出现的问题。
 * 运行时异常：RuntimeException及其子类，编译阶段不会出现错误提醒，运行时出现的异常（如：数组索引越界异常）
 * 编译时异常：编译阶段就会出现错误提醒的。（如：日期解析异常）
 */

/**
 * 抛出异常（throws） :
 * 在方法上使用throws关键字，可以将方法内部出现的异常抛出去给调用者处理。
 * 方法 throws 异常1 ，异常2 ，异常3 ..{
 *        …}
 * 捕获异常(try…catch):
 * 直接捕获程序出现的异常。
 * try{
 * // 监视可能出现异常的代码！
 * }catch(异常类型1 变量){
 * // 处理异常}
 * catch(异常类型2 变量){
 * // 处理异常
 * }...
 *
 */

/**
 * 异常是什么？
 * 异常是代码在编译或者执行的过程中可能出现的错误。
 * 异常的代表是谁？分为几类？
 * Exception，分为两类：编译时异常、运行时异常。
 * 编译时异常：没有继承RuntimeExcpetion的异常，编译阶段就会出错。
 * 运行时异常：继承自RuntimeException的异常或其子类，编译阶段不报错，运行时出现的。
 * 异常代码层面的处理有几种方式？
 * 用来查找bug；可以作为方法内部的特殊返回值，通知上层调用者底层的执行情况。
 */
public class ExceptionTest1 {
    public static void main(String[] args) throws ParseException {
        //报错:NumberFormatException,看源码知道这是运行时异常
        //Integer.valueOf("abc");

        //报错：ArrayIndexOutOfBoundsException
        // int[] arr = {11, 22, 33};
        // System.out.println(arr[5]);

        //报错：ParseException，看源码，是直接继承exception，是编译时异常
        try {
            //try监视这一块代码
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date d = sdf.parse("2028-11-11 10:24");
            System.out.println(d);
        } catch (ParseException e) {
            //如果真的有异常，就会抓住异常给变量e，然后e调异常对象方法，把异常的信息打印出来
            e.printStackTrace();
        }

        //如果不try catch，也不throws ParseException，在写代码的时候就会报错提示的就是编译时异常
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年-MM月-dd日 HH:mm:ss");
        Date d1 = sdf1.parse("2022-2-2 10:44");
        System.out.println(d1);
    }
}